//904.水果成篮
#include<iostream>
#include<vector>
#include<utility>
#include<unordered_map>
using namespace std;

int totalFruit(vector<int> &fruits)
{
    unordered_map<int, int> hash;

    int left = 0, right = 0;
    int maxlen = 0;

    //记录哈希桶的个数
    int bucket = 0;

    while (right < fruits.size())
    {
        // 进窗口，移动右指针
        hash[fruits[right]]++;
        //当某元素第一次插入时，桶的个数加一
        if (hash[fruits[right]] == 1)
        {
            bucket++;
        }


        //当桶的个数大于二时，水果种类超过三种，要移除一种
        if (bucket > 2)
        {
            //出窗口，直到桶的个数，也就是水果种类小于等于2
            while (left < right && bucket > 2)
            {
                hash[fruits[left]]--;
                if (hash[fruits[left]] == 0)
                {
                    hash.erase(fruits[left]);
                    bucket--;
                }
                left++;
            }
        }

        //更新子数组的最大长度
        maxlen = max(maxlen, right - left + 1);

        right++;
    }

    return maxlen;
}

int main()
{
    vector<int> Fruit = {3, 3, 3, 1, 2, 1, 1, 2, 3, 3, 4};
    int max = totalFruit(Fruit);
    cout << max;
    return 0;
}